package utility

import (
	"context"
	"github.com/gogf/gf/v2/frame/g"
	"github.com/gogf/gf/v2/net/gclient"
	"github.com/gogf/gf/v2/os/gctx"
	"time"
)

// 默认请求头
var defaultHeaders = g.MapStrStr{
	"Content-Type": "application/json",
	"Request-From": "Dashboard",
}

// 默认超时时间（秒）
const defaultTimeout = 50

// initClient 设置客户端的超时时间和请求头
func initClient(ctx context.Context, headers g.MapStrStr) (*gclient.Client, context.Context, context.CancelFunc) {
	// 设置默认超时时间
	if ctx == nil {
		ctx = gctx.New()
	}
	ctx, cancel := context.WithTimeout(ctx, defaultTimeout*time.Second)

	// 创建客户端
	client := g.Client()

	if headers == nil {
		headers = defaultHeaders
	}

	// 设置请求头
	for key, value := range headers {
		client.SetHeader(key, value)
	}

	return client, ctx, cancel
}

// Get 发起 GET 请求
// url: 请求地址
// params: 请求参数
// headers: 请求头（可选）
// timeout: 超时时间（可选，默认 10 秒）
func Get(ctx context.Context, url string, params g.Map, headers g.MapStrStr) (*gclient.Response, error) {
	client, ctx, cancel := initClient(ctx, headers)
	defer cancel()
	// 发起 GET 请求
	return client.Get(ctx, url, params)
}

// Post 发起 POST 请求
// url: 请求地址
// data: 请求体数据
// headers: 请求头（可选）
// timeout: 超时时间（可选，默认 10 秒）
func Post(ctx context.Context, url string, data interface{}, headers g.MapStrStr) (*gclient.Response, error) {
	client, ctx, cancel := initClient(ctx, headers)
	defer cancel()

	// 发起 POST 请求
	return client.Post(ctx, url, data)
}
